之前要做監控Oracle DB狀況的一個小型專案,因為使用的資源不多,所以想用樹莓派來當做Server,以節省建置成本。
雖然最後改以PRTG Network Monitor這套軟體來使用,但是紀錄一下,也許未來還可以應用到其他的方面。
一開始在我的PC上測試,是以python+cx_oracle+Oracle Instant Client來寫程式,使用上並沒有問題。
cx_Oracle 是一個Python 擴充模組,可讓python使用資料庫 API 來查詢和更新 Oracle 資料庫,不過現在已改為python-oracledb
可參考官方文件:https://python-oracledb.readthedocs.io/en/latest/user_guide/introduction.html
Oracle Instant Client是用來建立和執行連線至遠端或本機Oracle Database 的應用程式
把程式轉到Raspberry pi時發現Oracle Clinet並沒有ARM CPU版本,也就是說Raspberry pi無法連接Oracle DB
後來只好轉一個方向,換用python的paramiko套件,透過SSH 連線方式來執行遠端機器的程式
所以方法改以SSH連線至DB Server,由DB Server執行Script來取得資料並回傳給Raspberry pi上的python
首先在Raspberry pi OS 安裝python模組paramiko
# pip3 install paramiko
import paramiko
port =22
username = test
password = 123456
IP = 192.168.1.10
oraonlineCom = "./test.sh" #DB Server上欲執行的Script檔,此檔放在家目錄底下
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(IP,port,username, password)
stdin, stdout, stderr = ssh.exec_command(oraonlineCom)
oradata = stdout.readlines()
print( str(oradata[0].strip('\n')) )
stdout.close()
stdin.close()
stderr.close()
ssh.close()
#!/bin/bash
sqlplus -s USERNAME/PASSWORD << EOF
SET SERVEROUTPUT ON
SET FEEDBACK OFF
DECLARE
reVal varchar(30);
BEGIN
SELECT count(DISTINCT icx.session_id) into reVal
FROM apps.icx_sessions icx
WHERE disabled_flag != 'Y'
AND icx.pseudo_flag = 'N'
AND ( last_connect +( 30 / 60 / 24)) > SYSDATE
AND icx.counter < limit_connects;
DBMS_OUTPUT.PUT_LINE(reVal);
END;
/
EXIT
EOF
####程式說明
這樣的方法雖然有點偏道,但是可以從Raspberry pi取到Oracle DB的資料,也是一種解決的方式。
PRTG需windows才能裝,且sensor在免費版有限制。假設主機不多。PRTG 的確是個好選擇